package testTrieSimple;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

import trieSimple.TrieSimple;
import trieSimple.TrieNode;

public class TrieSimpleTest {

    
    
    
    
    /**
     * 5. 删除一个单词
     */
    @Test
    public void test_deleteWord(){
        TrieSimple aTrieSimple=new TrieSimple();
        aTrieSimple.insert("abcder");
        aTrieSimple.insert("abcdef");
        aTrieSimple.insert("abkedf");
        aTrieSimple.insert("abkedfx");
        aTrieSimple.insert("abked");
        aTrieSimple.insert("de");
        
        System.out.println(" 删除前:   "+aTrieSimple.searchPrefixRtNode("abc").preFixFreq);
        System.out.println(aTrieSimple);
        aTrieSimple.deleteWord("abcdef");
        System.out.println(" 删除后:   "+aTrieSimple.searchPrefixRtNode("abc").preFixFreq);
        
        
        
        
        System.out.println("  ...  ");
        System.out.println(aTrieSimple);
        
    
    }
    
    
    
    
    /**
     * 4. 测试词缀的节点。 例如appl获取 l所在的节点， 如果不存在这个词缀则返回null
     */
    @Test
    public void test_searchPrefixRtNode(){
        TrieSimple aTrieSimple=new TrieSimple();
        aTrieSimple.insert("abcder");
        aTrieSimple.insert("abcdef");
        aTrieSimple.insert("abkedf");
        aTrieSimple.insert("abkedfx");
        aTrieSimple.insert("abked");
        aTrieSimple.insert("de");
        aTrieSimple.insert("xde");
        aTrieSimple.insert("dxe");
        aTrieSimple.insert("/2015-0637");
        aTrieSimple.insert("x");
        assertTrue(aTrieSimple.searchPrefixRtNode("x").preFixFreq==2);
        assertTrue(aTrieSimple.searchPrefixRtNode("ab").preFixFreq==5);
        
        TrieNode tNode = aTrieSimple.searchPrefixRtNode("xs");
        if (null == tNode) {
            System.out.println("null");
        }else{
            System.out.println(tNode.nodeChar+"   "+tNode.preFixFreq);
        }
        
        
    }
    
    
    /**
     * 3. 测试搜索字符串。
     */
    @Test
    public void test_getWordsNode(){
        TrieSimple aTrieSimple=new TrieSimple();
        aTrieSimple.insert("abcder");
        aTrieSimple.insert("abcdef");
        aTrieSimple.insert("abkedf");
        aTrieSimple.insert("abkedfx");
        aTrieSimple.insert("abked");
        aTrieSimple.insert("de");
        aTrieSimple.insert("/2015-0637");
        aTrieSimple.insert("x");
        TrieNode tnode=aTrieSimple.searchWordRtNode("abkedf");
        assertTrue(aTrieSimple.searchWordRtNode("x")!=null);
        assertTrue(aTrieSimple.searchWordRtNode("abx")==null);
        assertTrue(aTrieSimple.searchWordRtNode("de")!=null);
        assertTrue(aTrieSimple.searchWordRtNode("abke")==null);
        assertTrue(aTrieSimple.searchWordRtNode("abked")!=null);
        assertTrue(aTrieSimple.searchWordRtNode("abcdef")!=null);
        if (null==tnode) {
            System.out.println("null");
        }else {
            System.out.println(tnode.nodeChar+"   "+tnode.preFixFreq);
        }
    }
    
    
    
    
    /**
     * 2. 测试 输出  toString。  测试输出TrieSimple对象
     * 测试输出Trie树里面的所有单词。 
     */
    @Test
    public void test_toString(){
        TrieSimple aTrieSimple=new TrieSimple();
        aTrieSimple.insert("abcder");
        aTrieSimple.insert("abcdef");
        aTrieSimple.insert("abked");
        aTrieSimple.insert("de");
        aTrieSimple.insert("/2015-0637");
        aTrieSimple.insert("x");
        
        System.out.println(aTrieSimple);
        
    }
    
    
    
    /**1. 测试： insert()
     * 测试向Trie树里面添加单词。 
     */
    @Test
    public void test_addNodes(){
        TrieSimple aTrieSimple=new TrieSimple();
        aTrieSimple.insert("abcde");
        TrieNode currNode=aTrieSimple.rootNode;
        
        //注意  此处必须要判断currNode.childNodes.size()>0， 因为每次建立一个节点，自动回初始化一个childNodes数组，虽然里面为空，但是不为null
        // 如果不判断size>0会造成死循环， 因为下面做了判断，进入if， 而如果之后的childNodes不是空但是size=0，进不了if，无法改变currNode值，就会造成死循环。 
        
        while (null!=currNode && currNode.childNodes.size()>0) {
            if (null != currNode.childNodes && currNode.childNodes.size()>0) {
                currNode=currNode.childNodes.get(0);
                System.out.print(currNode.nodeChar);
            }
        }
    }
    
    
    
    
}
